#!/usr/bin/env python

'''
MSER detector demo
==================

Usage:
------
    mser.py [<video source>]

Keys:
-----
    ESC   - exit

'''

import numpy as np
import cv2
import time
#import video
import sys

from matplotlib import pyplot as plt

if __name__ == '__main__':

    #如果想要了解各参数的含义，首先需要通过以上链接了解算法原理。
    #2表示灰度值的变化量，10和5000表示检测到的组块面积的范围，0.5为最大的变化率，0.3为稳定区域的最小变换量
##    MSER算法所需要的参数较多：
##    delta为灰度值的变化量，即公式1和2中的△；
##    _min_area和_max_area为检测到的组块面积的范围；
##    _max_variation为最大的变化率，即如果公式1和2中的q(i)小于该值，则被认为是最大稳定极值区域；
##    _min_diversity为稳定区域的最小变换量。
##    其他的参数用于对彩色图像的MSER检测，这里不做介绍。
##    MSER类通过重载( )运算符，得到了最大稳定极值区域的点集msers，其中image为输入图像，mask为掩码矩阵。
    #mser = cv2.MSER_create(_min_area = 500000 ,_max_area= 7000000)
    start = time.clock()
    mser = cv2.MSER_create(5,_min_area = 200000,_max_area= 600000,_min_diversity = 10)

    img = cv2.imread('F:/awei/code/mark/mark6.bmp',cv2.IMREAD_COLOR);
    #img.ndim
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    vis = img.copy()
    #gray = img.copy()

    regions, bboxes = mser.detectRegions(gray)
    hulls = [cv2.convexHull(p.reshape(-1, 1, 2)) for p in regions]

    for tt in regions:
        center, radius = cv2.minEnclosingCircle(tt)
        #center = np.int0(center)
        cv2.circle( vis, (int(center[0]),int(center[1])), int(radius), (255,0,0) )
        break
##        rect = cv2.minAreaRect(tt)
##        box = cv2.boxPoints(rect)
##        box = np.int0(box)
##        vis = cv2.drawContours(vis,[box],0,(0,0,255),2)

##    for box in bboxes:
##        print(box)
        #box = np.int0(box)
        #vis = cv2.drawContours(vis,[box],0,(0,0,255),2)


    #cv2.polylines(vis, hulls, 1, (0, 255, 0))
    end = time.clock()
    print("run time:",end-start)

    plt.subplot(111), plt.imshow(vis, cmap = "gray")
    #plt.title("Input"), plt.xticks([]), plt.yticks([])
    plt.show()

##    cv2.imshow('img', vis)
##    cv2.waitKey(5000)
##    cv2.destroyAllWindows()
